package com.zjj.learn.designmodel.work.interpreter;

public class InterpreterTest {

    public static void main(String[] args) {

        Context context = new Context();

        Variable a = new Variable("a");
        Variable b = new Variable("b");
        Variable c = new Variable("c");
        Variable d = new Variable("d");
        Variable e = new Variable("e");
        //Value v = new Value(1);

        context.assign(a, 1);
        context.assign(b, 2);
        context.assign(c, 3);
        context.assign(d, 4);
        context.assign(e, 5);

        AbstractExpression expression = new Minus(new Plus(new Plus(new Plus(a, b), c), d), e);

        System.out.println(expression + "= " + expression.interpret(context));
    }

    /**
     * 解释器模式
     *
     * 解释器模式是一种行为设计模式，它定义了一种语言、一种文法或是一些指令的解释器，用来解释在这种语言中的句子。
     *
     * 解释器模式的思想是把一个复杂的问题分解成多个简单的问题，每个简单的问题都可以通过一个解释器来解决。
     * 这样一来，我们就可以将复杂的问题转化为一系列简单的操作，这些操作便成了我们的语法规则。
     *
     * 解释器模式主要包含 5 中角色
     *     1、抽象表达式（Abstract Expression）角色：
     *              定义解释器的接口，约定解释器的解释操作，主要包含解释方法 interpret()。
     *              {@link com.zjj.learn.designmodel.work.interpreter.AbstractExpression}
     *     2、终结符表达式（Terminal  Expression）角色：
     *             是抽象表达式的子类，用来实现文法中与终结符相关的操作，文法中的每一个终结符都有一个具体终结表达式与之相对应。
     *             {@link com.zjj.learn.designmodel.work.interpreter.Value}
     *     3、非终结符表达式（Nonterminal Expression）角色：
     *             也是抽象表达式的子类，用来实现文法中与非终结符相关的操作，文法中的每条规则都对应于一个非终结符表达式。
     *             {@link com.zjj.learn.designmodel.work.interpreter.Plus}
     *             {@link com.zjj.learn.designmodel.work.interpreter.Minus}
     *     4、环境（Context）角色：
     *            通常包含各个解释器需要的数据或是公共的功能，一般用来传递被所有解释器共享的数据，后面的解释器可以从这里获取这些值。
     *            {@link com.zjj.learn.designmodel.work.interpreter.Context}
     *     5、客户端（Client）：
     *            主要任务是将需要分析的句子或表达式转换成使用解释器对象描述的抽象语法树，然后调用解释器的解释方法，当然也可以通过环境角色间接访问解释器的解释方法。
     *            {@link com.zjj.learn.designmodel.work.interpreter.InterpreterTest}
     **/
}
